powershell相当于linux的“mkdir -p”?

hsgswve4  于 2023-03-02  发布在  Shell
关注(0)|答案(4)|浏览(127)

如何让powershell的“mkdir”命令完全像Linux的mkdir -p命令一样工作?
在Linux下,mkdir -p将创建嵌套目录,但前提是这些目录不存在。例如,假设您有一个目录/foo,并且您对该目录具有写权限。mkdir -p /foo/bar/baz将在现有/foo下创建bar和bar中的baz。再次运行相同的命令时,不会出现错误,但不会创建任何内容。

soat7uwm

soat7uwm1#

您可以使用-ErrorAction SilentlyContinue参数忽略PowerShell中的错误(您可以将其缩短为-ea 0)。

New-Item /foo/bar/baz -ItemType Directory -ea 0

您可以将其缩短为

md /foo/bar/baz -ea 0

(You如果愿意,也可以键入mkdir而不是md。)
请注意,PowerShell将输出它在使用New-Item -ItemType Directory(或mdmkdir别名)时创建的DirectoryInfo对象。如果不需要任何输出,可以通过管道传输到Out-Null

flmtquvp

flmtquvp2#

Unix的PowerShell等价物
mkdir -p ...

    • 一米一米一**
    • -Force-p一样,实现了 * 所需状态 * 逻辑**,这确保了两件事:
  • 它 * 根据需要 * 在目标目录路径中创建 * 中间 * 目录,这些目录可能还不存在(New-Item -Type Directory与Unix mkdir不同,甚至 * 在默认情况下 * 也是这样做的)。
  • 如果目标目录已经存在,则会 * 成功 *。

一个关键的区别是:除非发生错误:

  • mkdir -p产生 * 无输出 *。
  • 相比之下,New-Item -Type Directory输出一个[System.IO.DirectoryInfo]示例,表示目标目录。因此,要模拟mkdir -p的行为,必须 * 丢弃 * 此输出,最好通过赋值给$null$null = New-Item ...)来完成。
    • 注意事项**:
  • 在 * Windows * 上,mkdir是一个 * 内置 Package 函数 *,它将参数传递给New-Item-Type Directory
  • 在 * 类Unix * 平台上-在跨平台 * PowerShell [Core] v6 +* 版本中-mkdir * 不是 * 内置命令,而是遵从平台原生外部mkdir实用程序。
  • 因此,如果脚本需要跨平台,请显式使用New-Item

注意:如果您 * 省略 * -Force并简单地 * 忽略错误*,如Bill Stewart's answer(使用-ErrorAction SilentlyContinue-ErrorAction Ignore)中所示,您将获得类似的行为,* 除了输出行为将随情况而变化:

  • 如果目标目录 * 已经存在 *,则 * 不 * 产生输出(因为发生了被忽略的错误),而如果目标目录是 * 创建的 *,则返回表示它的[System.IO.DirectoryInfo]示例。
  • New-Item -Type Directory和Unix mkdir之间的一个根本区别是,只有前者在需要时 * 默认 * 创建 * 中间 * 目录。

mkdir仅对-p执行此操作。

xzv2uavs

xzv2uavs3#

New-Item -Path "c:\some\folder\path" -ItemType Directory
tgabmvqs

tgabmvqs4#

-Force中使用mkdir怎么样?我觉得这很好用,它会从指定路径创建所有目录,如果目录已经存在,也不会出错。

mkdir path/to/my/target/dir -force

结果:

PS > mkdir path/to/my/target/dir -force
    Directory: C:\Users\Sam\path\to\my\target

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          25/09/2020    13:18                dir

# We can check that all directories have been created
PS > tree path
C:\USERS\SAM\PATH
└───to
    └───my
        └───target
            └───dir

# Let's run again now that the directories already exist
PS > mkdir path/to/my/target/dir -force
    Directory: C:\Users\Sam\path\to\my\target

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          25/09/2020    13:20                dir

# And check the result of the previous command
PS > $?
True

相关问题