【问题标题】:How can I run a command 'x' number of times, in batch file or PowerShell script?如何在批处理文件或 PowerShell 脚本中多次运行命令“x”?
【发布时间】:2015-08-11 08:54:07
【问题描述】:

我有一个维护脚本,它正在生成 .sql 文件,其中包含一些 SQL 脚本。

当文件大小达到限制时,我关闭文件并创建一个新文件,将数据转储到第二个文件中。

我不知道会生成多少文件(它基于当前时间的数据量)。到目前为止,它看起来大约有 100 个文件左右。

那么,有什么好办法可以说

  • 从目标目录中获取所有以.sql 结尾的文件。
  • 现在为每个命令运行此命令。

我在 SQL Server 的命令窗口中运行的命令是这样的:

sqlcmd -S 127.0.0.1 -d SomeDBTenant -U someUser -P somePassword -I -i c:\temp\SqlScript_1.sql

【问题讨论】:

标签: windows powershell batch-file command


【解决方案1】:

是的,您可以使用Get-ChildItem cmdlet 获取所有.sql 文件(如果您想递归执行,请添加-recurse)并为每个文件运行sqlcmd:

$sqlFiles = Get-ChildItem -Path 'C:\test' -Filter '*.sql' # you can do it recurse with -r
$sqlFiles | foreach { sqlcmd -S 127.0.0.1 -d SomeDBTenant -U someUser -P somePassword -I -i $_.FullName }

【讨论】:

    【解决方案2】:

    在 Windows 命令提示符下,您可以使用 for 遍历目录或目录树中与 (a) 特定模式匹配的所有文件,例如:

    rem remove the `/R` switch if you don't want to loop recursively
    for /R %%F in (*.sql) do (
      REM replace `%%~F` by `%%~fF` to pass the file's full path to the command
      sqlcmd -S 127.0.0.1 -d SomeDBTenant -U someUser -P somePassword -I -i "%%~F"
    )
    

    注意: 这仅适用于sqlcmd在枚举目录中创建/重命名/删除任何*.sql 文件时。此外,如果使用/R 选项,sqlcmd 必须修改枚举目录树。

    【讨论】:

    • 如果 sqlcmd 正在创建 .sql 文件,那么 for 命令可以重新处理一些 .sql 文件,等等。使用带有 dir 的 for 命令的 for /f 形式可以避免这种情况.
    • 好点,@foxidrive!我用非递归的for 试过一次,似乎for 枚举了一次目录内容;但是,我没有用/R 尝试这个——我会在接下来的几天里这样做并更正我的代码,以防万一......
    • 这是命令提示符的一个很好的答案。 BTW @foxidrive sqlcmd 可执行文件不会创建 .sql 文件。某些东西-else- 这样做...sqlcmd 只是解析/读取脚本(并执行它们)。
    • @Pure.Krome 您的 sqlcmd 创建的文件类型是什么?
    • 没有创造任何东西。 sqlcmd.exe 带有用于执行 cli 的 Sql Server。我有一个不同的应用程序可以创建文件(以.sql 结尾)并将其与 sqlcmd 一起使用。
    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 2013-07-30
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多